package baduga.core;

import javax.swing.table.AbstractTableModel;


/**
 * Klasa zawiera ugoólnioną struktórę modelu tabeli
 * 
 * @author Janek
 *
 */
public class Core_TableModel extends AbstractTableModel {

	
	/**
	 * Identyfikator do serializacji
	 */
	private static final long serialVersionUID = -8119568660091472809L;

	/** Tablica zawiera edytowalne elementy*/
	private boolean editableElem[] = null;
	
	/** dane w modelu */
	private Object data[][] = null;

	
	
	/** Nazwy kolumn */
	private String columsName[] = null;
	
	/** Nr. strony */
	private int pageNr = 1;
	
	/** Limit per Page */
	private int limitPerPage = 40;
	
	
	/** Autonumerowanie */
	private boolean autoNumerate;
	
	
	/** Pozycja w tablicy gdzie znajdują sie dane o ID stołu*/
	private final int tableIDPosition = 5;
	
	
	/** Liczba pól z danymi */
	private final int numDataField = 6; 
	
	
	
	/**
	 * 
	 * @param nEditElem
	 */
	public Core_TableModel(final boolean[] nEditElem, String nColumsName[], boolean nAutoNumerate)
	{
		super();
		editableElem = nEditElem;
		columsName = nColumsName;
		autoNumerate = nAutoNumerate;
	}
	

	
	
	
	
	
	@Override
	/**
	 * Funkcja definiuje czy komórka w tabeli ma być edytowalna
	 * 
	 * @return
	 */
    public boolean isCellEditable(final int row,final  int col) {
        return editableElem[col];

    }
	
	
	/**
	 * Funkcja wymusza zaktualizowanie modelu tabeli
	 */
	public void forceUpdateModel()
	{
		fireTableDataChanged(); 

	}
	
	
	/**
	 * Przetwarza output JSONA na poprawny
	 * 
	 * @param data
	 * @return
	 */
	public Object[][] reparse(Object[] data)
	{

		//def.
		Object output[][];
		int k, 
		    size = data.length / numDataField;
		
		//init.
		
		output = new Object[ data.length / numDataField ][numDataField];
		k = 0;
		
		
		for(int i = 0; i < size; i++)
		{
			for(int j = 0; j < numDataField; j++)
			{
				output[i][j] = data[k];
				
				++k;
			}
		}
		
		return output;
	}
	
	
	
	
	//------------------ [getters] - #START ------------------
	
	
	
	@Override
	/**
	 * Funkcja zwraca ilość kolumn
	 * 
	 * @return
	 */
	public int getColumnCount() {
		return columsName.length;
	}

	@Override
	/**
	 * Funkcja zwraca ilość rekordów w tabeli
	 * 
	 * @return
	 */
	public int getRowCount() {
		
		int res;
		
		if(data != null)
		{
			res = data.length;
		}
		else
		{
			res = 0;
		}
		
		
		return res;
	}


	@Override
	/**
	 * Funkcja zwraca wartość na zadanej pozycji w układzie x, y
	 * 
	 */
	public Object getValueAt(final int row,final  int coll) 
	{
		Object tmp;
		
		//Czy włączona jest autonumeracja
		if(autoNumerate)
		{
			
			if(coll != 0)
			{
				tmp = data[row][coll  - 1];
			}
			else
			{
				//(Limit stron * (Aktualna Strona - 1 ) + pozycja rekordu )
				tmp = Integer.valueOf(limitPerPage * (pageNr - 1) + row ) + 1;
			}
			
		}
		else
		{
			tmp = data[row][coll];
		}
	
		return tmp;
	}
	
	
	@Override
	/**
	 * Pobiera nazwę kolumny
	 */
	public String getColumnName(int column)
	{
		return this.columsName[column];
	}
	
	
	
	/**
	 * Funkcja pobiera z dataSetu rekord który zawiera kolumne z ID Tabeli do której chce dołączyć gracz
	 * 
	 * @param row
	 * @return
	 */
	public String getTableID(int row)
	{
		return data[row][tableIDPosition].toString();
	}
	
	/**
	 * Pobiera numer aktualnej strony
	 * 
	 * @return
	 */
	public int getPageNr()
	{
		return pageNr;
	}
	
	
	//------------------ [getters] - #END ------------------
	

	//------------------ [setters] - #START ------------------
	
	/**
	 * Funkcja aktualizuje dane w tabeli
	 * 
	 * @param nData
	 */
	public void setData(final Object nData[])
	{
		data = reparse(nData);
		forceUpdateModel();
	}
	
	/**
	 * Ustala aktualny numer strony
	 * 
	 * @return
	 */
	public void setPageNr(int nPageNr)
	{
		pageNr = nPageNr;
	}

	//------------------ [setters] - #END ------------------

}
